package uri.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import uri.model.MemberVO;
import uri.model.member.MemberService;

@Controller
public class MemberController {
	@Resource(name="memberServiceImpl")
	private MemberService memberService;
	
	@RequestMapping("main.do")
	public String mainView(){
		return "home";
	}
	/**
	 * @author 김은호 
	 * @date 2014.06.24
	 * comment : id,  password 정보를 mvo 로 받아 login 메서드에서 
	 * 				  해당 회원정보를 찾아 요청 처리 후 mvo 에 반환 받아 
	 * 				   session 처리 한 다음 main.jsp 로 이동한다.
	 */
	@RequestMapping("login.do")
	public ModelAndView login(MemberVO mvo, HttpSession session){
//		System.out.println("Controller.login");
		MemberVO memberVO=memberService.login(mvo);
//		System.out.println(memberVO);
		if(memberVO!=null){
			session.setAttribute("loginMember", memberVO);
			return new ModelAndView("home");
		}else{
			return new ModelAndView("member/login_fail");
		}
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.24
	 * comment : 로그아웃
	 */
	@RequestMapping("logout.do")
	public ModelAndView logout(HttpSession session){
		//System.out.println("Controller.logout");
			session.invalidate();
		return new ModelAndView("home");
	}
	

	/**
	 * @author 김은호 
	 * @date 2014.06.24
	 * comment : register_view.jsp 로 이동
	 */
	@RequestMapping("register.do")
	public String registerView(){
		return "member/register_view";
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.24
	 * comment : mvo 를 받아 registerMember 메서드에서 요청 처리 후
	 * 				  register_result_view.jsp 로 이동
	 */
	@RequestMapping("register_result.do")
	public ModelAndView registerMember(MemberVO mvo){
		System.out.println("Controller.registerMember");
		memberService.registerMember(mvo);
		return new ModelAndView("register_result.member");
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.24
	 * comment : 
	 */
	@RequestMapping("idCheck.do")
	@ResponseBody
	public Map idCheck(String id){
		System.out.println("Controller.idCheck");
		HashMap map=new HashMap();
		int idCount=memberService.idCheck(id);
		map.put("idCount", idCount);
		return map;
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.24
	 * comment : 
	 */
	@RequestMapping("ssnCheck.do")
	@ResponseBody
	public Map ssnCheck(String ssn){
		System.out.println("Controller.ssnCheck");
		System.out.println(ssn);
		int ssnCount=memberService.ssnCheck(ssn);
		System.out.println(ssnCount);
		HashMap map=new HashMap();
		map.put("ssnCount", ssnCount);
		return map;
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.24
	 * comment : myinfo_view.jsp 로 이동
	 */
	@RequestMapping("auth_myinfo.do")
	public String myInfo(){
		return "myinfo.member";
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.24
	 * comment : check_password_view.jsp 로 이동
	 * 
	 * 작성자: 장해나
	 * 수정일: 07/07
	 * 회원탈퇴시의 비밀번호 검사를 위해 type 으로 분류
	 */
	@RequestMapping("auth_check_password.do")
	public String checkPasswordView(String type){
		if(type.equals("1")){
			return "withdraw_check_password.member";
		}
		return "check_password.member";
	}

	/**
	 * 
	 * @author 김은호 
	 * @date 2014.06.25
	 * comment : 입력받은 password 와 session 에 저장되어있는 password 를 
	 * 				  비교하여 password 확인 후 회원정보수정 페이지로 이동
	 */
	@RequestMapping("auth_check_password_result.do")
	public ModelAndView checkPassword(String password, HttpSession session){
		System.out.println("Controller.checkPasswordResult");
		System.out.println(password);
		MemberVO mvo=(MemberVO) session.getAttribute("loginMember");
		System.out.println(mvo);
		if(password.equals(mvo.getPassword())){
			return new ModelAndView("update.member");
		}else{
			return new ModelAndView("check_password.member");
		}
	}

	@RequestMapping("auth_delete_confirm.do")
	public String deleteConfirm(){
		return "delete.member";
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.25
	 * comment : session 정보를 받아서 id  확인 후 회원탈퇴
	 * 
	 * 작성자: 장해나
	 * 수정일: 07/07
	 * 회원탈퇴시 비밀번호 일치여부 확인
	 */
	@RequestMapping("auth_delete.do")
	public ModelAndView deleteMember(String password,HttpSession session){
		//System.out.println("withdraw");
		//System.out.println(password);
		MemberVO mvo=(MemberVO) session.getAttribute("loginMember");
		//System.out.println(mvo);
		if(password.equals(mvo.getPassword())){
			memberService.deleteMember(mvo.getId());
			session.invalidate();
			return new ModelAndView("home");
		}else{
			return new ModelAndView("withdraw_password_fail.member");
		}
	}
	/**
	 * @author 김은호 
	 * @date 2014.06.25
	 * comment : 아이디, 주민번호, 포인트를 제외한 회원정보수정
	 * 
	 * 작성자: 장해나
	 * 수정일: 07/07
	 * 아이디, 주민번호, 포인트, 비밀번호 제외한 정보수정
	 * 세션 정보 업데이트
	 */
	@RequestMapping("auth_update.do")
	public ModelAndView updateMemberInfo(MemberVO mvo,HttpSession session){
		System.out.println("Controller.updateMemberInfo");
		System.out.println(mvo);
		memberService.updateMemberInfo(mvo);
		session.setAttribute("loginMember", mvo);
		return new ModelAndView("update_result.member", "mvo", mvo);
	}
	
	@RequestMapping("findId.do")
	public String findIdView(){
		return "findId.member";
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.25
	 * comment : 주민번호를 입력받아 해당 아이디를 찾는 메서드
	 * 
	 * 작성자: 장해나
	 * 수정일: 07/08
	 * 아이디 찾기 시, 비밀번호 확인을 위한 과정을 추가
	 */
	@RequestMapping("findId_result.do")
	public ModelAndView findId(String ssn){
		String id=memberService.findId(ssn);
		if(id!=null){
			//return new ModelAndView("findId_result.member", "id", id);
			return new ModelAndView("findId_check_password.member","id",id);
		}
		return new ModelAndView("member/findId_fail");
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 07/08
	 * 아이디 찾기 시 비밀번호 확인 폼으로 이동하는 메서드
	 */
	@RequestMapping("findId_check_password.do")
	public ModelAndView findId_check_password(String id){
		return new ModelAndView("findId_check_password.member","id",id);
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 07/08
	 * 아이디 찾기 시 비밀번호 일치 여부를 확인하는 메서드
	 */
	@RequestMapping("findId_check_result.do")
	public ModelAndView findId_check_result(String id,String password, HttpSession session){
		MemberVO mvo=new MemberVO();
		mvo.setPassword(password);
		mvo.setId(id);
		System.out.println(mvo);
		String rid=memberService.findIdCheck(mvo);
		if(rid!=null){
			return new ModelAndView("findId_result.member", "id", rid);
		}else{
			return new ModelAndView("redirect:findId_check_password.do?id="+id);
		}
	}
	
	@RequestMapping("findPassword.do")
	public String findPasswordView(){
		return "findPassword.member";
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 07/09
	 * 비밀번호 찾기 시 주민번호 확인 폼으로 이동하는 메서드
	 */
	@RequestMapping("findPassword_check_ssn.do")
	public ModelAndView findPassword_check_ssn(String password){
		return new ModelAndView("findPassword_check_ssn.member","password",password);
	}
	/**
	 * 작성자: 장해나
	 * 작성일: 07/09
	 * 비밀번호 찾기 시 주민번호 일치 여부를 확인하는 메서드
	 */
	@RequestMapping("findPassword_check_result.do")
	public ModelAndView findPassword_check_result(String password,String ssn, HttpSession session){
		MemberVO mvo=new MemberVO();
		mvo.setSsn(ssn);
		mvo.setPassword(password);
		System.out.println(mvo);
		String rpassword=memberService.findPasswordCheck(mvo);
		if(rpassword!=null){
			return new ModelAndView("findPassword_result.member", "rpassword", rpassword);
		}else{
			return new ModelAndView("redirect:findPassword_check_ssn.do?password="+password);
		}
	}
	/**
	 * @author 김은호 
	 * @date 2014.06.25
	 * comment : 아이디를 입력받아 해당 비밀번호를 찾는 메서드
	 *
	 * 작성자: 장해나
	 * 수정일: 07/09
	 * 아이디 찾기 시 주민번호 일치 여부 확인하는 과정 추가
	 */
	@RequestMapping("findPassword_result.do")
	public ModelAndView findPassword(String id){
		String password=memberService.findPassword(id);
		if(password!=null){
			// return new ModelAndView("findPassword_result.member", "pass", password);
			return new ModelAndView("findPassword_check_ssn.member","password",password);
		}
		return new ModelAndView("member/findPassword_fail");
	}
	
	@RequestMapping("auth_updatePasswordView.do")
	public String updatePasswordView(){
		return "update_password.member";
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.25
	 * comment : 현재 비밀번호와 session 에 저장되어있는 비밀번호를 비교한 후
	 * 				  일치하면 새로운 비밀번호로 수정하고 일치하지않으면 원래 페이지로 이동한다.
	 * 
	 * 작성자: 장해나
	 * 수정일: 07/08
	 * 모든 비밀번호가 수정되는 문제를 해결하기 위해 새로운 비밀번호를 set 한 후, vo 를 전달
	 * 해당 아이디의 비밀번호만 변경되도록 하기 위해서이다.
	 */
	@RequestMapping("auth_updatePassword.do")
	public ModelAndView updatePassword(String password, String newPassword, HttpSession session){
		//System.out.println(newPassword);
		MemberVO mvo=(MemberVO) session.getAttribute("loginMember");
		if(password.equals(mvo.getPassword())){
			mvo.setPassword(newPassword);
			session.setAttribute("loginMember", mvo);
			memberService.updateMemberPassword(mvo);
			return new ModelAndView("update_password_result.member");
		}
		return new ModelAndView("member/update_password_fail");
	}
	
	/**
	 * @author 이상호
	 * @date 2014.07.03
	 * 로그인 뷰
	 */
	@RequestMapping("member/loginView.do")
	public ModelAndView loginView(){
		return new ModelAndView("member/login_view");
	}
	
	/**
	 * @author 이상호
	 * @date 2014.07.07
	 * 로그인 뷰로 가기 전 alert 을 띄우는 페이지
	 */
	@RequestMapping("member/loginCheckView.do")
	public ModelAndView loginCheckView(){
		return new ModelAndView("member/login_check_view");
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.25
	 * comment : 회원 목록
	 */
	@RequestMapping("auth_getAllMemberList.do")
	public ModelAndView getAllMemberList(){
		System.out.println("Controller.getAllMemberList");
		List<MemberVO> list=memberService.getAllMemberList();
		return new ModelAndView("admin/member_list.member", "list", list);
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.25
	 * comment : 검색어 종류와 검색단어를 매개변수로 받아서 해당 정보 리스트 보기
	 */
	@RequestMapping("findMember.do")
	@ResponseBody
	public List<MemberVO> findMember(String selectType, String word){
		System.out.println("Controller.findMember");
		return memberService.findMember(selectType, word);
	}
	
	/**
	 * @author 김은호 
	 * @date 2014.06.25
	 * comment : 선택한 회원을 매개변수로 받아와서 탈퇴
	 */
	@RequestMapping("removeMember.do")
	public ModelAndView removeMember(String mess){
		System.out.println("Controller.removeMember");
		System.out.println("mess : "+mess);
		memberService.removeMember(mess);
		return new ModelAndView("admin/removeMember_result.member");
	}
}
